package com.atguigu.demo.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.connection.RedisConfiguration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;

@Configuration
public class RedisConfig {

    @Value("${spring.data.redis.host}")
    private String host;

    @Value("${spring.data.redis.password}")
    private String password;

    // 由于 Spring 默认放入 IoC 容器的是 RedisTemplate
    @Bean
    public StringRedisTemplate redisTemplate() {
        // 1、创建 Redis 配置对象，目的是封装 Redis 的配置信息（主要是连接信息）
        RedisStandaloneConfiguration redisConfiguration = new RedisStandaloneConfiguration();
        redisConfiguration.setHostName(host);
        redisConfiguration.setPassword(password);

        // 2、创建连接工厂对象，具体来说因为底层使用的是 Lettuce 实现，所以实现类选择 LettuceConnectionFactory
        LettuceConnectionFactory factory = new LettuceConnectionFactory(redisConfiguration);

        // 3、调用 start() 方法对连接工厂执行初始化
        factory.start();

        // 4、创建 StringRedisTemplate 对象返回，最终放入 IoC 容器
        return new StringRedisTemplate(factory);
    }

    @Bean
    public RedisScript<Boolean> redisScript() {
        ClassPathResource resource = new ClassPathResource("lua/test.lua");
        return RedisScript.of(resource, Boolean.class);
    }
}
